package com.jahepi.android.dto;

import com.jahepi.android.Utils;

public class Viaje extends ObjetoBase {
	
	public static String TIPO_POR_KM = "POR_KM";
	public static String TIPO_POR_VIAJE = "POR_VIAJE";
	
	private int id;
	private String fechaSalida;
	private String fechaCancelacion;
	private Banco banco;
	private Material material;
	private Camion camion;
	private Frente frente;
	private Usuario usuario;
	private String dispositivo;
	private double latitud;
	private double longitud;
	private boolean pendiente;
	private String tipo;
	private int viajePendiente;
	private int remoteAndroidId;
	
	public Viaje() {
		tipo = TIPO_POR_KM;
	}
	
	public String getFechaSalida() {
		return fechaSalida;
	}
	
	public void setFechaSalida(String fechaSalida) {
		this.fechaSalida = fechaSalida;
	}

	public Banco getBanco() {
		return banco;
	}

	public void setBanco(Banco banco) {
		this.banco = banco;
	}

	public Material getMaterial() {
		return material;
	}
	
	public double getCamionCapacidad() {
		if(camion != null) {
			return camion.getCapacidad();
		}
		return 0;
	}
	
	public void setMaterial(Material material) {
		this.material = material;
	}

	public Camion getCamion() {
		return camion;
	}

	public void setCamion(Camion camion) {
		this.camion = camion;
	}
	
	public Tipo getCamionTipo() {
		if(camion != null) {
			return camion.getTipo();
		}
		return null;
	}
	
	public String getCamionFotografia() {
		if(camion != null) {
			return camion.getFotografia();
		}
		return null;
	}
	
	public double getLatitud() {
		return latitud;
	}
	
	public void setLatitud(double latitud) {
		this.latitud = latitud;
	}

	public double getLongitud() {
		return longitud;
	}

	public void setLongitud(double longitud) {
		this.longitud = longitud;
	}
	
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}
	
	public String getTipo() {
		return tipo;
	}

	public void setPorKm() {
		this.tipo = TIPO_POR_KM;
	}
	
	public void setPorViaje() {
		this.tipo = TIPO_POR_VIAJE;
	}
	
	public String getFrenteId() {
		if(frente != null) {
			return frente.getId();
		}
		return "";
	}
	
	public String getBancoId() {
		if(banco != null) {
			return banco.getId();
		}
		return "";
	}
	
	public String getMaterialId() {
		if(material != null) {
			return material.getId();
		}
		return "";
	}
	
	public int getCamionId() {
		if(camion != null) {
			return camion.getId();
		}
		return 0;
	}
	
	public String getHoraSalida() {
		String[] partes = fechaSalida.split(" ");
		if(partes.length == 2) {
			return partes[1];
		}
		return "";
	}
	
	public String getDiaSalida() {
		String[] partes = fechaSalida.split(" ");
		if(partes.length == 2) {
			String[] partesDia = partes[0].split("-");
			if(partesDia.length == 3) {
				return partesDia[2] + "-" + partesDia[1] + "-" + partesDia[0];
			}
		}
		return "";
	}
	
	public String getObraId() {
		if(camion != null) {
			return camion.getObraId();
		}
		return "";
	}
	
	public Frente getFrente() {
		return frente;
	}

	public void setFrente(Frente frente) {
		this.frente = frente;
	}
	
	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}
	
	public String getUsuarioId() {
		if(usuario != null) {
			return usuario.getUsuario();
		}
		return null;
	}
	
	public String getDispositivo() {
		return dispositivo;
	}

	public void setDispositivo(String dispositivo) {
		this.dispositivo = dispositivo;
	}
	
	public String getFechaCancelacion() {
		return fechaCancelacion;
	}

	public void setFechaCancelacion(String fechaCancelacion) {
		this.fechaCancelacion = fechaCancelacion;
	}
	
	public double getMaterialCantidad() {
		if(material != null) {
			return material.getCantidad();
		}
		return 0;
	}

	public void setMaterialCantidad(double materialCantidad) {
		if(material != null) {
			material.setCantidad(materialCantidad);
		}
	}
	
	public String getMaterialUnidad() {
		if(material != null) {
			return material.getUnidad();
		}
		return null;
	}
	
	public void setPendiente(boolean pendiente) {
		this.pendiente = pendiente;
	}
	
	public boolean getPendiente() {
		return pendiente;
	}
	
	public void setViajePendiente(int viajePendiente) {
		this.viajePendiente = viajePendiente;
	}
	
	public int getViajePendiente() {
		return viajePendiente;
	}
	
	public int getRemoteAndroidId() {
		return remoteAndroidId;
	}

	public void setRemoteAndroidId(int remoteAndroidId) {
		this.remoteAndroidId = remoteAndroidId;
	}
	
	public String getCodigoBarras() {
		String d = dispositivo.substring(dispositivo.length() - 5);
		//return d + camion.getObraId() + getFrenteId() + Integer.toString(camion.getId()) + Utils.limpiarFecha(fechaSalida);
		return  d + getId() + Utils.limpiarFecha(fechaSalida);
	}
	
	public String getCodigoBarrasParche() {
		String codigo = getCodigoBarras();
		String parte1 = codigo.substring(0, codigo.length() - 4);
		String parte2 = codigo.substring(codigo.length() - 4);
		return parte1 + " " + parte2;
	}
	
	public void reiniciar() {
		fechaSalida = null;
		camion = null;
		banco = null;
		material = null;
		banco = null;
		frente = null;
		id = 0;
		pendiente = false;
	}
	
	public String getTicketCamionString() {
		if(Viaje.esValido(this)) {
			String str = "VIAJE ID: " +  getAndroidId() + "\n";
			str += "FECHA SALIDA: " + getDiaSalida() + "\n";
			str += "HORA SALIDA: " + getHoraSalida() + "\n";
			str += "USUARIO: " + usuario.getNombre() + "\n";
			str += "OBRA: " +  camion.getObraNombre() + "\n";
			str += "CAMION ID: " + camion.getId() + "\n";
			if(material.esCantidadFija()) {
				str += "CAPACIDAD CAMION: " + camion.getCapacidad() + " m3\n";
			} else {
				str += "CAPACIDAD CAMION: " + material.getCantidad() + " m3\n";
			}
			str += "PROPIETARIO: " + camion.getPropietarioNombre() + "\n";
			str += "FRENTE: " + frente.getNombre() + "\n";
			str += "DISTANCIA: " + banco.getDistancia() + " KM\n";
			str += "MATERIAL: " + material.getNombre() + "\n\n";
			str += "CODIGO: \n";
			str += getCodigoBarras();
			return str;
		}
		return null;
	}
	
	public String getTicketBancoString() {
		if(Viaje.esValido(this)) {
			String str = "VIAJE ID: " + getAndroidId() + "\n";
			str += "FECHA SALIDA: " + getDiaSalida() + "\n";
			str += "HORA SALIDA: " + getHoraSalida() + "\n";
			str += "USUARIO: " + usuario.getNombre() + "\n";
			str += "OBRA: " +  camion.getObraNombre() + "\n";
			str += "FRENTE: " + frente.getNombre() + "\n";
			str += "DISTANCIA: " + banco.getDistancia() + " KM\n";
			if(material.esCantidadFija()) {
				str += "CAPACIDAD CAMION: " + camion.getCapacidad() + " m3\n";
			} else {
				str += "CAPACIDAD CAMION: " + material.getCantidad() + " m3\n";
			}
			str += "MATERIAL: " + material.getNombre() + "\n\n";
			str += "CODIGO: \n";
			str += getCodigoBarras();
			return str;
		}
		return null;
	}
	
	public String toHtml() {
		if(Viaje.esValido(this)) {
			String str = "<b>Fecha Salida:</b> " + getDiaSalida() + "<br/>";
			str += "<b>Hora Salida:</b> " + getHoraSalida() + "<br/>";
			str += "<b>Usuario:</b> " + usuario.getNombre() + "<br/>";
			str += "<b>Obra:</b> " +  camion.getObraNombre() + "<br/>";
			str += "<b>Camion ID:</b> " + camion.getId() + "<br/>";
			if(material.esCantidadFija()) {
				str += "<b>Camion Capacidad:</b> " + camion.getCapacidad() + " m3<br/>";
			} else {
				str += "<b>Camion Capacidad:</b> " + material.getCantidad() + " m3<br/>";
			}
			str += "<b>Propietario:</b> " + camion.getPropietarioNombre() + "<br/>";
			str += "<b>Frente:</b> " + frente.getNombre() + "<br/>";
			str += "<b>Distancia:</b> " + banco.getDistancia() + " KM<br/>";
			str += "<b>Material:</b> " + material.getNombre();
			return str;
		}
		return null;	
	}
	
	public boolean equals(Object o) {
		Viaje viaje = (Viaje) o;
		return viaje.getId() == getId();
	}
	
	public String obtenerDetalle() {
		return "Usuario: " + usuario.getNombre() + " Viaje ID: " + getAndroidId() + " - Camion ID: " + camion.getId() + " - Fecha Salida: " + getDiaSalida() + " " + getHoraSalida();  
	}
	
	public static boolean esValido(Viaje viaje) {
		if(
		        viaje.getCamion() == null || 
				viaje.getBanco() == null || 
				viaje.getCamion() == null || 
				viaje.getFrente() == null || 
				viaje.getMaterial() == null || 
				viaje.getUsuario() == null ||
				viaje.getObraId().equals("")
			) {
			return false;
		}
		return true;
	}
	
	private int getAndroidId() {
		return remoteAndroidId == 0 ? id : remoteAndroidId;
	}
}
